class ListNode {
    public int val;
    public ListNode next;

    public ListNode(int val){
        this.val = val;
    }
}


public class MyArrayList {
    public ListNode head;

    public void createList() {
        ListNode listNode1 = new ListNode(12);
        ListNode listNode2 = new ListNode(23);
        ListNode listNode3 = new ListNode(34);
        ListNode listNode4 = new ListNode(45);
        ListNode listNode5 = new ListNode(56);

        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;

        this.head = listNode1;
    }

    /**
     * 打印全部的链表，不需要返回值，所以是void
     */
    public void display() {
        ListNode cur = this.head;

        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

    /**
     * 查找是否包含关键字key是否存在在单链表中
     *
     * @param key
     * @return
     */
    public boolean contain(int key) {
        ListNode cur = this.head;
        while (cur != null) {
            if (key == cur.val) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

    /**
     * 得到单链表的长度
     */
    public int size() {
        int count = 0;
        ListNode cur = this.head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;

    }

    /**
     * 头插法
     */
    public void addFirst(int data) {

        ListNode node = new ListNode(data);
        node.next = this.head;
        this.head = node;

    }

    /**
     * 尾插法
     */
    public void addLast(int data) {
        ListNode node = new ListNode(data);
        ListNode cur = this.head;
        if (this.head == null) {
            this.head = node;
        } else {
            while (cur != null) {
                cur = cur.next;
            }
            cur.next = node;
        }
    }


    /**
     * 找到index-1的位置的节点的地址
     */
    public ListNode FindIndex(int index) {
        ListNode cur = this.head;
        while (index - 1 != 0) {//这里的减一不会改变index的值
            cur = cur.next;
            index--;
        }
        return cur;
    }


    /**
     * 任意位置插入，第一个数据节点为0号下标
     */
    public void addIndex(int index, int data) {
        if (index < 0 || index > size()) {
            System.out.println("位置不合法");
            return;
        }
        if (index == 0) {
            addFirst(data);
            return;
        }
        if (index == size()) {
            addLast(data);
            return;
        }
        ListNode cur = FindIndex(index);
        ListNode node = new ListNode(data);

        node.next = cur.next;
        cur.next = node;

    }

    /**
     * 找到要删除数字的前驱
     */

    public ListNode searchPrev(int key) {
        ListNode cur = this.head;
        while (cur != null) {
            if (cur.next.val == key) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }

    /**
     * 删除第一次出现关键字为key的节点
     */
    public void remove(int key) {

        if (this.head == null) {
            System.out.println("单链表为空，不能删除");
            return;
        }
        if (this.head.val == key) {
            this.head = head.next;
            return;
        }
        ListNode cur = searchPrev(key);
        if (cur == null) {
            System.out.println("没有你删除的节点");
            return;
        }
        ListNode del = cur.next;
        cur.next = del.next;
    }

    /**
     * 删除所有值为key的节点
     */
    public ListNode removeAllKey(int key) {
        if (this.head == null) {
            System.out.println("单链表为空，找的关键字不存在");
            return null;
        }
        if (this.head.val == key) {
            this.head = head.next;
        }
        ListNode prev = this.head;
        ListNode cur = this.head.next;
        while (cur != null) {
            if (cur.val == key) {
                prev.next = cur.next;
                cur = cur.next;
            } else {
                prev = cur;
                cur = cur.next;
            }
        }
        return this.head;
    }



    /**
     * 清空列表
     */
    public void clear(){
        while(this.head == null){
            ListNode curNext = this.head.next;
            this.head.next = null;
            this.head = curNext;
        }
    }

    /**
     * 反转链表
     */
    public ListNode reverseList(){
        if(this.head == null){
            return null;
        }
        ListNode cur = this.head;
        ListNode prev = null;


    }

}


